package org.apache.maven.execution;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
import org.apache.maven.model.Profile;
import org.apache.maven.project.ProjectBuildingRequest;
import org.apache.maven.settings.Mirror;
import org.apache.maven.settings.Proxy;
import org.apache.maven.settings.Server;
import org.codehaus.plexus.logging.Logger;
import org.eclipse.aether.RepositoryCache;
import org.eclipse.aether.repository.WorkspaceReader;
import org.eclipse.aether.transfer.TransferListener;

/**
 * @author Jason van Zyl
 */
public interface MavenExecutionRequest {
  // ----------------------------------------------------------------------
  // Logging
  // ----------------------------------------------------------------------

  int LOGGING_LEVEL_DEBUG = Logger.LEVEL_DEBUG;

  int LOGGING_LEVEL_INFO = Logger.LEVEL_INFO;

  int LOGGING_LEVEL_WARN = Logger.LEVEL_WARN;

  int LOGGING_LEVEL_ERROR = Logger.LEVEL_ERROR;

  int LOGGING_LEVEL_FATAL = Logger.LEVEL_FATAL;

  int LOGGING_LEVEL_DISABLED = Logger.LEVEL_DISABLED;

  // ----------------------------------------------------------------------
  // Reactor Failure Mode
  // ----------------------------------------------------------------------

  /**
   * 快速失败
   */
  String REACTOR_FAIL_FAST = "FAIL_FAST";

  /**
   * 最后才失败
   */
  String REACTOR_FAIL_AT_END = "FAIL_AT_END";

  /**
   * 不失败
   */
  String REACTOR_FAIL_NEVER = "FAIL_NEVER";

  // ----------------------------------------------------------------------
  // Reactor Make Mode
  // ----------------------------------------------------------------------

  String REACTOR_MAKE_UPSTREAM = "make-upstream";

  String REACTOR_MAKE_DOWNSTREAM = "make-downstream";

  String REACTOR_MAKE_BOTH = "make-both";

  // ----------------------------------------------------------------------
  // Artifact repository policies
  // ----------------------------------------------------------------------

  String CHECKSUM_POLICY_FAIL = ArtifactRepositoryPolicy.CHECKSUM_POLICY_FAIL;

  String CHECKSUM_POLICY_WARN = ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN;

  // ----------------------------------------------------------------------
  //
  // ----------------------------------------------------------------------

  // Base directory
  MavenExecutionRequest setBaseDirectory(File basedir);

  String getBaseDirectory();

  // Timing (remove this)
  MavenExecutionRequest setStartTime(Date start);

  Date getStartTime();

  // Goals
  MavenExecutionRequest setGoals(List<String> goals);

  List<String> getGoals();

  // Properties

  /**
   * Sets the system properties to use for interpolation and profile activation. The system
   * properties are collected from the runtime environment like {@link System#getProperties()} and
   * environment variables.
   *
   * @param systemProperties The system properties, may be {@code null}.
   * @return This request, never {@code null}.
   */
  MavenExecutionRequest setSystemProperties(Properties systemProperties);

  /**
   * Gets the system properties to use for interpolation and profile activation. The system
   * properties are collected from the runtime environment like {@link System#getProperties()} and
   * environment variables.
   *
   * @return The system properties, never {@code null}.
   */
  Properties getSystemProperties();

  /**
   * Sets the user properties to use for interpolation and profile activation. The user properties
   * have been configured directly by the user on his discretion, e.g. via the {@code -Dkey=value}
   * parameter on the command line.
   *
   * @param userProperties The user properties, may be {@code null}.
   * @return This request, never {@code null}.
   */
  MavenExecutionRequest setUserProperties(Properties userProperties);

  /**
   * Gets the user properties to use for interpolation and profile activation. The user properties
   * have been configured directly by the user on his discretion, e.g. via the {@code -Dkey=value}
   * parameter on the command line.
   *
   * @return The user properties, never {@code null}.
   */
  Properties getUserProperties();

  // Reactor
  MavenExecutionRequest setReactorFailureBehavior(String failureBehavior);

  String getReactorFailureBehavior();

  MavenExecutionRequest setSelectedProjects(List<String> projects);

  List<String> getSelectedProjects();

  MavenExecutionRequest setResumeFrom(String project);

  String getResumeFrom();

  MavenExecutionRequest setMakeBehavior(String makeBehavior);

  String getMakeBehavior();

  void setThreadCount(String threadCount);

  String getThreadCount();

  boolean isThreadConfigurationPresent();

  void setPerCoreThreadCount(boolean perCoreThreadCount);

  boolean isPerCoreThreadCount();

  // Recursive (really to just process the top-level POM)
  MavenExecutionRequest setRecursive(boolean recursive);

  boolean isRecursive();

  MavenExecutionRequest setPom(File pom);

  File getPom();

  // Errors
  MavenExecutionRequest setShowErrors(boolean showErrors);

  boolean isShowErrors();

  // Transfer listeners
  MavenExecutionRequest setTransferListener(TransferListener transferListener);

  TransferListener getTransferListener();

  // Logging
  MavenExecutionRequest setLoggingLevel(int loggingLevel);

  int getLoggingLevel();

  // Update snapshots
  MavenExecutionRequest setUpdateSnapshots(boolean updateSnapshots);

  boolean isUpdateSnapshots();

  MavenExecutionRequest setNoSnapshotUpdates(boolean noSnapshotUpdates);

  boolean isNoSnapshotUpdates();

  // Checksum policy
  MavenExecutionRequest setGlobalChecksumPolicy(String globalChecksumPolicy);

  String getGlobalChecksumPolicy();

  // Local repository
  MavenExecutionRequest setLocalRepositoryPath(String localRepository);

  MavenExecutionRequest setLocalRepositoryPath(File localRepository);

  File getLocalRepositoryPath();

  MavenExecutionRequest setLocalRepository(ArtifactRepository repository);

  ArtifactRepository getLocalRepository();

  // Interactive
  MavenExecutionRequest setInteractiveMode(boolean interactive);

  boolean isInteractiveMode();

  // Offline
  MavenExecutionRequest setOffline(boolean offline);

  boolean isOffline();

  boolean isCacheTransferError();

  MavenExecutionRequest setCacheTransferError(boolean cacheTransferError);

  boolean isCacheNotFound();

  MavenExecutionRequest setCacheNotFound(boolean cacheNotFound);

  // Profiles
  List<Profile> getProfiles();

  MavenExecutionRequest addProfile(Profile profile);

  MavenExecutionRequest setProfiles(List<Profile> profiles);

  MavenExecutionRequest addActiveProfile(String profile);

  MavenExecutionRequest addActiveProfiles(List<String> profiles);

  MavenExecutionRequest setActiveProfiles(List<String> profiles);

  List<String> getActiveProfiles();

  MavenExecutionRequest addInactiveProfile(String profile);

  MavenExecutionRequest addInactiveProfiles(List<String> profiles);

  MavenExecutionRequest setInactiveProfiles(List<String> profiles);

  List<String> getInactiveProfiles();

  // Proxies
  List<Proxy> getProxies();

  MavenExecutionRequest setProxies(List<Proxy> proxies);

  MavenExecutionRequest addProxy(Proxy proxy);

  // Servers
  List<Server> getServers();

  MavenExecutionRequest setServers(List<Server> servers);

  MavenExecutionRequest addServer(Server server);

  // Mirrors
  List<Mirror> getMirrors();

  MavenExecutionRequest setMirrors(List<Mirror> mirrors);

  MavenExecutionRequest addMirror(Mirror mirror);

  // Plugin groups
  List<String> getPluginGroups();

  MavenExecutionRequest setPluginGroups(List<String> pluginGroups);

  MavenExecutionRequest addPluginGroup(String pluginGroup);

  MavenExecutionRequest addPluginGroups(List<String> pluginGroups);

  boolean isProjectPresent();

  MavenExecutionRequest setProjectPresent(boolean isProjectPresent);

  File getUserSettingsFile();

  MavenExecutionRequest setUserSettingsFile(File userSettingsFile);

  File getGlobalSettingsFile();

  MavenExecutionRequest setGlobalSettingsFile(File globalSettingsFile);

  MavenExecutionRequest addRemoteRepository(ArtifactRepository repository);

  MavenExecutionRequest addPluginArtifactRepository(ArtifactRepository repository);

  /**
   * Set a new list of remote repositories to use the execution request. This is necessary if you
   * perform transformations on the remote repositories being used. For example if you replace
   * existing repositories with mirrors then it's easier to just replace the whole list with a new
   * list of transformed repositories.
   *
   * @param repositories
   * @return This request, never {@code null}.
   */
  MavenExecutionRequest setRemoteRepositories(List<ArtifactRepository> repositories);

  List<ArtifactRepository> getRemoteRepositories();

  MavenExecutionRequest setPluginArtifactRepositories(List<ArtifactRepository> repositories);

  List<ArtifactRepository> getPluginArtifactRepositories();

  MavenExecutionRequest setRepositoryCache(RepositoryCache repositoryCache);

  RepositoryCache getRepositoryCache();

  WorkspaceReader getWorkspaceReader();

  MavenExecutionRequest setWorkspaceReader(WorkspaceReader workspaceReader);

  File getUserToolchainsFile();

  MavenExecutionRequest setUserToolchainsFile(File userToolchainsFile);

  ExecutionListener getExecutionListener();

  MavenExecutionRequest setExecutionListener(ExecutionListener executionListener);

  ProjectBuildingRequest getProjectBuildingRequest();

  /**
   * @since 3.1
   */
  boolean isUseLegacyLocalRepository();

  /**
   * @since 3.1
   */
  MavenExecutionRequest setUseLegacyLocalRepository(boolean useLegacyLocalRepository);

}
